﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BonIt.Tests
{
    using System.Data.Linq.Moles;

    using Bon.It.Proxy;
    using Bon.It.Proxy.Moles;
    using Bon.It.Server;
    using Bon.It.Server.Moles;

    using Bon_It.Model;

    [TestClass]
    public class TestBase 
    {

        private TestContext testContextInstance;

        /// <summary>
        ///Ruft den Testkontext auf, der Informationen
        ///über und Funktionalität für den aktuellen Testlauf bietet, oder legt diesen fest.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [TestInitialize]
        public void TestInit()
        {
            this.AssignMoles();
        }

        protected List<Belege> belege;
        protected List<Artikel> articles;
        protected List<Rechnung> rechnungen;
        private MTable<Belege> mBelege;
        private MTable<Artikel> mArticles;
        private MTable<Rechnung> mRechnung;
  
        private void AssignMoles()
        {
            MServiceProxy.InstanceGet = () => new ContractManager();
            MContractManager.AllInstances.GetDataContext = (d) => new Bon_It.Model.DataContextDataContext(""); 
            MContractManager.AllInstances.GetDataContextDataLoadOptions = (d,dlo) => new Bon_It.Model.DataContextDataContext(""); 

            this.AssignBelegmoles();
            this.AssignArticleMoles();
            this.AssignRechnungMoles();

        }

        private void CreateMTables<T>( List<T> input , MTable<T> table ) where T : class
        {

            table.Bind(input);

            table.AttachTEntity = input.Add;
            table.DeleteOnSubmitTEntity = (item) => input.Remove(item);
            table.InsertOnSubmitTEntity = (i) => { input.Add(i); };
            table.GetEnumerator = () =>
                { return input.GetEnumerator(); };

        }
      
        private void AssignRechnungMoles()

        {
            rechnungen = new List<Rechnung>();
            mRechnung = new MTable<Rechnung>();
            this.CreateMTables(rechnungen,mRechnung);
        }

        private void AssignArticleMoles()
        {
            articles  = new List<Artikel>();
            mArticles  = new MTable<Artikel>();
            this.CreateMTables(articles, mArticles);
            
        }

        private void AssignBelegmoles()
        {
            belege = new List<Belege>();
            mBelege  = new MTable<Belege>();
            this.CreateMTables(belege, mBelege);
         
             
        }



    }

}
